//
//  ModelRxSwiftExtension.swift
//  Intersection
//
//  Created by 好东家 on 2022/8/22.
//

//import HandyJSON
import Foundation
import RxSwift
import SmartCodable
import Moya


///数据映射错误
public enum RxMapModelError: Error {
    /// 数据映射错误
    case parsingError
}
//
////扩展Observable：增加模型映射方法
//public extension Observable where Element:Any {
//
//    //将JSON数据转成对象
//    func toModel<T>(type:T.Type) -> Observable<T> where T:HandyJSON {
//        return self.map { (element) -> T in
//            guard let parsedElement = T.deserialize(from: element as? Dictionary) else {
//                throw RxMapModelError.parsingError
//            }
//
//            return parsedElement
//        }
//    }
//
//    //将JSON数据转成数组
//    func toModels<T>(type:T.Type) -> Observable<[T]> where T:HandyJSON {
//        return self.map { (element) -> [T] in
//            guard let parsedArray = [T].deserialize(from: element as? [Any]) else {
//                throw RxMapModelError.parsingError
//            }
//
//            return parsedArray as! [T]
//        }
//    }
//}



//扩展方法走BaseModel以防止HandyJson出问题多处修改
//扩展Observable：增加模型映射方法
@available(iOS 13.0, *)
extension Observable where Element:Any {
    
    // 添加默认参数控制错误处理，默认开启错误处理
    func showError(show: Bool = true) -> Observable<Element> {
        return self.catch { error -> Observable<Element> in
            guard show else { return .error(error) }
            
            // 在UI线程显示错误提示（需根据项目UI框架调整）
            DispatchQueue.main.async {
                HUD.showErrorHint(hint: "数据处理错误")
            }
            return .error(error)
        }
    }
    
    // MARK: - SmartCodable
    
    //将JSON数据转成对象
    public func toModel<T>(type:T.Type, handleError: Bool = true) -> Observable<T> where T:SmartCodable {
        return self.map { (element) -> T in
            
            guard let parsedElement = T.toModel(dictionary: element as? Dictionary) else {
                throw RxMapModelError.parsingError
            }
            
            return parsedElement
        }
        .showError(show: handleError)
    }
    
    //将JSON数据转成数组
    public func toModels<T>(type:T.Type) -> Observable<[T]> where T:SmartCodable {
        return self.map { (element) -> [T] in
            
            let parsedArray = [T].toModels(json: element as? [Any])
            
            return parsedArray
        }
    }
    
    
}




@available(iOS 13.0, *)
extension PrimitiveSequence where Trait == SingleTrait {
    
    
    // 添加默认参数控制错误处理，默认开启错误处理
    func showError(show: Bool = false) -> Single<Element> {
        return self.catch { error -> Single<Element> in
            guard show else { return .error(error) }
            
            // 在UI线程显示错误提示（需根据项目UI框架调整）
            DispatchQueue.main.async {
                HUD.showErrorHint(hint: "数据处理错误")
            }
            return .error(error)
        }
    }
    
    
    // MARK: - SmartCodable
    
    //将JSON数据转成对象
    public func toModel<T>(type:T.Type, handleError: Bool = false) -> Single<T> where T:SmartCodable {
        return self.map { (element) -> T in
            
            guard let parsedElement = T.toModel(dictionary: element as? [String: Any]) else {
                throw RxMapModelError.parsingError
            }
            
            return parsedElement
        }
        .showError(show: handleError)
    }
    
    //将JSON数据转成数组
    public func toModels<T>(type:T.Type) -> Single<[T]> where T:SmartCodable {
        return self.map { (element) -> [T] in
                        
            let parsedArray = [T].toModels(json: element as? [Any])
            
            return parsedArray
        }
    }
    
}
